package main

import (
	"fmt"
	"net/http"
	"time"
)

type Message struct {
	Type    string `json:"type"`              // 消息类型，比如：“join”、“leave”、“message”
	Room    string `json:"room,omitempty"`    // 房间ID，加入房间或发送消息时需要指定房间ID
	To      string `json:"to,omitempty"`      // 接收消息的用户名，发送消息时需要指定接收者用户名（用于私聊）
	Id      string `json:"id,omitempty"`      // 消息ID，用于标识每条消息，用于回复消息时指定回复的消息ID
	Payload string `json:"payload,omitempty"` // 消息内容，可以为json或text
	Seq     int    `json:"seq,omitempty"`     // 消息序号
	Time    int    `json:"time,omitempty"`    // 消息发送时间
}

type Broadcast struct {
	Room string `json:"room,omitempty"`
	Data []byte `json:"data,omitempty"`
	To   string `json:"to,omitempty"`
}

const (
	pongWait       = time.Second * 60    // 客户端最大响应时间，超过该时间未收到响应则认为连接已断开
	pingPeriod     = (pongWait * 9) / 10 // 心跳检测周期，一般设置为响应时间的90%
	writeWait      = 10 * time.Second    // 发送消息的最大等待时间，超过该时间未发送成功则认为连接已断开
	maxMessageSize = 1024 * 8            // 最大消息大小，单位：字节
)

func main() {
	// 启动hub监听协程
	hub := NewHub()
	go hub.run()

	http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {
		serverWs(hub, w, r)
	})

	fmt.Println("start to listen and serve at :8080")

	if err := http.ListenAndServe(":8080", nil); err != nil {
		fmt.Println("listen and serve failed: " + err.Error())
	}
}
